package org.firefly.db.dialect;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.firefly.db.meta.ColumnMeta;
import org.firefly.db.meta.TableMeta;


/**
 * 数据库方言接口
 * @author firefly
 */
public interface IDialect {

	/**
	 * 类型对照，通过java类型获得sql类型
	 * @param javaType 见java.sql.Types
	 * @return
	 */
	public String javaType2SQLType(int javaType);
	
	/**
	 * 类型对照，通过sql类型获得java类型
	 * @param sqlType
	 * @return 见java.sql.Types
	 */
	public int sqlType2JavaType(String sqlType);
	
	/**
	 * 判断列类型是否支持长度
	 * @param ColumnMeta 为了提高oracle DECIMAL、DOUBLE、NUMERIC的精准度 增加了这个带有ColumnMeta参数的方法
	 * @param javaType
	 * @return
	 */
	public boolean columnTypeHasLength(ColumnMeta cm, int javaType);
	
	/**
	 * 判断列类型是否支持长度
	 * @param javaType
	 * @return
	 */
	public boolean columnTypeHasLength(int javaType);
	
	/**
	 * 判断列类型是否支持小数
	 * @param javaType
	 * @return
	 */
	public boolean columnTypeHasDecimal(int javaType);
	
	/**
	 * 处理值,提供更新或插入
	 * @param cls java类型
	 */
	public String processSQLVal(Object val, int javaType, ColumnMeta cm);

	/**
	 * 命名符号，例如 'TableName' \ 'FieldName'
	 * @return
	 */
	public String getNamingChar();

	/**
	 * 字符串连接 例如 oracle的'||'或 sqlServer的'+'
	 * @param a
	 * @param b
	 * @return 链接好的表达式
	 */
	public String getConcatStr(String a,String b);

	/**
	 * 字符串处理
	 * @param a
	 * @return
	 */
	public String processStr(String a);
	
	/**
	 * 单表支持的最大列数
	 * @return
	 */
	public int maxCols();
	/**
	 * 生成clobsql
	 * @return
	 */
	public List<String> buildClobSql(TableMeta targetTM, String columnName, Map<String,Object> v) throws SQLException ;

	/**
	 * 生成分页sql
	 * @return
	 */
	public String getPaginationSql(String selectSql,
			String tablename,
			String tAlias,
			String pk,
			String fromTableSql,
			String orderBySql,String whereSql, int curPageNo, int pageSize);
	
	/**
	 * 获得修改列的关键词
	 * @return
	 */
	public String getModifyColumnKey();

    /**
     * 获得字段长度
     * @param javaType
     * @param length
     * @return
     */
    public int getLength(int javaType, int length);
}